package cn.song.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.reactive.function.client.ExchangeStrategies;
import org.springframework.web.util.DefaultUriBuilderFactory;
import reactor.netty.http.client.HttpClient;
import org.springframework.http.client.reactive.ReactorClientHttpConnector;

/**
 * Web 客户端配置
 *
 * @author SongRenShuo
 * @date 2025/02/09
 */
@Configuration
public class WebClientConfig {

    @Bean
    public WebClient registerClient() {
        // 配置WebClient，禁用自动重定向跟随，以正确处理301/302等重定向响应
        HttpClient httpClient = HttpClient.create()
                /* 禁用自动重定向跟随
                 * 禁用后：
                 * 客户端 -> 请求转发服务 -> 目标服务(返回301)
                 * 客户端 <- 请求转发服务 <- 直接传递301响应
                 * 禁用前(默认)：
                 * 客户端 -> 请求转发服务 -> 目标服务(返回301)
                 * 请求转发服务 -> 自动跟随重定向 -> 新地址
                 * 客户端 <- 请求转发服务 <- 最终响应(200)
                 * */
                .followRedirect(false);

        // 创建UriBuilderFactory并设置编码模式为NONE，避免URL参数被二次编码
        DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory();
        uriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE);

        return WebClient.builder()
                .clientConnector(new ReactorClientHttpConnector(httpClient))
                .uriBuilderFactory(uriBuilderFactory)
                .exchangeStrategies(ExchangeStrategies.builder()
                        // 内存限制 设置为50MB
                        .codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(50 * 1024 * 1024))
                        .build())
                .build();
    }
}